{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73bd968b-d970-4a05-94ef-4e7abf990827",
   "metadata": {},
   "source": [
    "Chapter 23\n",
    "\n",
    "# 不同坐标系\n",
    "Book_3《数学要素》 | 鸢尾花书：从加减乘除到机器学习 (第二版)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "422f25cc-515c-4869-a695-54aa6d495b8d",
   "metadata": {},
   "source": [
    "这段代码的主要目的是通过可视化的方式展示二维向量的操作，包括向量的绘制、线性变换以及对应的坐标系变化。代码首先定义了一个绘制向量的函数`draw_vector`，该函数接受一个向量、颜色和标签作为参数，并在二维平面上从原点绘制该向量。同时，函数将向量的坐标以文本的形式注释在图中，以便于观察。\n",
    "\n",
    "在代码的主要部分，定义了两个向量$a = [4, 3]$和$b = [1, 3]$，以及基向量$i = [1, 0]$、$j = [0, 1]$和$k = [0, 0, 1]$。接着，通过生成一个包含 $x_1$ 和 $x_2$ 的网格，并使用线性变换矩阵$A = \\begin{bmatrix} 1 & 1 \\\\ 2 & 4 \\end{bmatrix}$，计算出变换后的坐标 $Z = X \\cdot A^T$，从而得到两个新的变量$ZZ_1$和$ZZ_2$。这种线性变换通过矩阵乘法将原始坐标系中的点映射到新的坐标系。\n",
    "\n",
    "可视化部分通过`matplotlib`绘制了两幅图：第一幅图展示了原始坐标系中的基向量和向量$b$，第二幅图则展示了经过线性变换后的新坐标系。通过设置坐标轴的范围和比例，确保向量及其变换的可视化效果清晰可见。最后，代码中还包含了坐标轴的标签和美化的设定，使得图形更加美观且易于理解。\n",
    "\n",
    "从数学的角度来看，向量的线性组合和变换可以用以下公式表示：\n",
    "\n",
    "1. 向量的定义：\n",
    "   $$ a = \\begin{pmatrix} 4 \\\\ 3 \\end{pmatrix}, \\quad b = \\begin{pmatrix} 1 \\\\ 3 \\end{pmatrix} $$\n",
    "\n",
    "2. 线性变换：\n",
    "   $$ Z = X \\cdot A^T $$\n",
    "\n",
    "3. 变换后的新坐标：\n",
    "   $$ Z_1 = Z[:, 0], \\quad Z_2 = Z[:, 1] $$\n",
    "\n",
    "通过以上的操作，代码直观地展示了向量的基本运算以及其在不同坐标系下的表现，帮助理解线性代数中的重要概念。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ff5c1a22-5214-4b6c-bc0f-b55e41bf269f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d05b2463-656e-4cb4-bd62-93819270d5dc",
   "metadata": {},
   "source": [
    "## 定义绘制向量的函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "ca4c2108-7294-4bca-b811-d233fff70339",
   "metadata": {},
   "outputs": [],
   "source": [
    "def draw_vector(vector,RBG): \n",
    "    array = np.array([[0, 0, vector[0], vector[1]]], dtype=object)  # 创建一个包含向量起点和终点的数组\n",
    "    X, Y, U, V = zip(*array)  # 解压数组，获取起点和终点坐标\n",
    "    plt.quiver(X, Y, U, V, angles='xy', scale_units='xy', scale=1, color=RBG, zorder = 1000)  # 绘制向量"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09061d8c-e1a5-431f-a3c1-fca8fa85547b",
   "metadata": {},
   "source": [
    "## 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "220555e0-40d3-44cd-80e7-56baf8b3438e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建 x1 和 x2 的范围\n",
    "x1 = np.arange(-25, 25 + 1, step=1);\n",
    "x2 = np.arange(-25, 25 + 1, step=1);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "447fdaff-f7ba-40d1-9dd7-662d256befb8",
   "metadata": {},
   "outputs": [],
   "source": [
    "XX1, XX2 = np.meshgrid(x1, x2);  # 生成网格"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "0e260c5d-ee2f-4bf9-9a69-d7cedaac0dcb",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.column_stack((XX1.ravel(), XX2.ravel()))  # 将网格数据转化为列向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8ab8eb51-3094-4872-a2d3-8c10f9325836",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义线性变换的矩阵 A\n",
    "A = np.matrix([[1, 1],\n",
    "                [2, 4]]);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ece4c4bc-765c-4593-bebb-e42e99c25686",
   "metadata": {},
   "outputs": [],
   "source": [
    "Z = X @ A.T;  # 对 X 应用线性变换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "bfec3bc0-5ac0-4232-b758-0e5b8609c817",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 重新调整变换后的结果为网格形状\n",
    "ZZ1 = Z[:, 0].reshape((len(x1), len(x2)))\n",
    "ZZ2 = Z[:, 1].reshape((len(x1), len(x2)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9df184ba-d41f-48ba-9541-d6eee9fee90c",
   "metadata": {},
   "source": [
    "## e1 和 e2 的可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "8f51b418-ec89-47f6-81f1-b866796e29dd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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a665RhMnTtRXv/pVrVixQrt379b1118f1/NDoZDuuOOOLpcV4Tze78zi/c483vPMSuX9dv02eqm1kfnee+/Vp59+qvLyct1///2aOnWq22UBALJYVgQYAACJyopfJQUAQKIIMACAJxFgAABPIsAAAJ7k6QBz4hgWxKe6ulqTJk1SQUGBiouLdcUVV2jbtm1ul5UzqqurFQgEtGDBArdL8a09e/bo6quv1uDBg3XKKaeosrJStbW1bpflWy0tLbr99ts1evRo9e/fX6effrruuusuRaPRuF/DswF24hiWn/zkJ9q4caMuuOACXXLJJdq9e7fbpfnS2rVrNXfuXL311ltas2aNWlpaNHPmTB0+fNjt0nzv3Xff1YoVKzRu3Di3S/GthoYGTZ48WX379tWLL76orVu36le/+pUGDRrkdmm+dc899+i3v/2tHnzwQb3//vu699579Ytf/EK//vWv434Nz95Gn+gxLHDWvn37VFxcrLVr19Kzl0aHDh3ShAkT9NBDD+nuu+9WZWWlli1b5nZZvnPrrbfq9ddfZxUngy677DINHTpUjzzySOzat7/9bZ1yyin6wx/+ENdreHIGduzYMdXW1mrmzJntrs+cOVNvvPGGS1XllsbGRklSUVGRy5X429y5c3XppZfqoosucrsUX3v++ec1ceJEfec731FxcbHGjx+vhx9+2O2yfG3KlCl65ZVXtH37dknSpk2btH79es2aNSvu13D9V0klI5ljWOAcy7K0cOFCTZkyReXl5W6X41tPPfWUNmzYoHfffdftUnxv586dWr58uRYuXKjbbrtN77zzjubNm6dQKKTvf//7bpfnS7fccosaGxs1ZswYGYYh0zS1ZMkSfe9734v7NTwZYCckcgwLnHPjjTdq8+bNWr9+vdul+FZ9fb3mz5+vl19+Wf369XO7HN+LRqOaOHGili5dKqn1hOAtW7Zo+fLlBFiaPP3003riiSe0cuVKlZWVKRKJaMGCBRo+fLjmzJkT12t4MsA4hsU9N910k55//nmtW7dOI0aMcLsc36qtrdXevXtVVVUVu2aaptatW6cHH3xQzc3NMgzDxQr9ZdiwYRo7dmy7a+ecc45WrVrlUkX+t2jRIt1666268sorJUkVFRXatWuXqqur4w4wT+6BcQxL5lmWpRtvvFHPPvusXn31VY0ePdrtknxtxowZqqurUyQSiX1MnDhRs2fPViQSIbwcNnny5E5tIdu3b9fIkSNdqsj/jhw5omCwfQQZhpHQbfSenIFJqR/DgsTMnTtXK1eu1OrVq1VQUBCb/RYWFqp///4uV+c/BQUFnfYXBwwYoMGDB7PvmAY333yzvva1r2np0qX67ne/q3feeUcrVqzQihUr3C7Nty6//HItWbJEpaWlKisr08aNG3Xffffpuuuui/9FLA/7zW9+Y40cOdLKy8uzJkyYYK1du9btknxLUpcfjz32mNul5Yxp06ZZ8+fPd7sM3/rzn/9slZeXW6FQyBozZoy1YsUKt0vytaamJmv+/PlWaWmp1a9fP+v000+3fvKTn1jNzc1xv4Zn+8AAALnNk3tgAAAQYAAATyLAAACeRIABADyJAAMAeBIBBgDwJAIMAOBJBBgAwJMIMACAJxFgQBapr6/X7NmzFQ6HFQ6HddVVV6mhocHtsoCsRIABWWLHjh2qqqrSGWecoTfffFN/+9vf9OGHH2rRokVulwZkJX4XIpAlLrroIk2ePFl33nln7NqqVau0aNEi7dy5U9/85jdVU1OjGTNm6JlnnnGxUiA7EGBAFti1a5dGjRql/v37tzsjyTRNlZSUaPv27Xrttdd06NAhPf744wQYIA+fBwb4yaZNm1RUVKS3336709dOnLd24YUXqqamJsOVAdmLAAOyQN++ffXll19q2LBhGjBggNvlAJ7ATRxAFjj//PM1cOBAXXPNNYpEItqxY4deeuklzZ8/3+3SgKxFgAFZoKioSC+88IIaGho0bdo0TZgwQbfddptGjRrldmlA1mIJEcgS5513nl577TW3ywA8g7sQAY+4+OKLtWHDBh0+fFhFRUV67rnnNGnSJLfLAlxDgAEAPIk9MACAJxFgAABPIsAAAJ5EgAEAPIkAAwB4EgEGAPAkAgwA4EkEGADAkwgwAIAnEWAAAE8iwAAAnvT/AUR2DohaI6tPAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.plot(XX1, XX2, color=[0.8, 0.8, 0.8])  # 绘制网格线\n",
    "plt.plot(XX1.T, XX2.T, color=[0.8, 0.8, 0.8])  # 绘制网格线\n",
    "\n",
    "a1 = A[:, 0].tolist()  # 提取 A 的第一列\n",
    "a2 = A[:, 1].tolist()  # 提取 A 的第二列\n",
    "b = [3, 8]  # 定义一个向量 b\n",
    "\n",
    "draw_vector(a1, np.array([0, 112, 192]) / 255)  # 绘制第一个基向量\n",
    "draw_vector(a2, np.array([255, 0, 0]) / 255)  # 绘制第二个基向量\n",
    "\n",
    "draw_vector(b, np.array([255, 125, 255]) / 255)  # 绘制向量 b\n",
    "\n",
    "plt.xlabel('$e_1$')  # 设置 x 轴标签\n",
    "plt.ylabel('$e_2$')  # 设置 y 轴标签\n",
    "\n",
    "plt.axis('scaled')  # 设置坐标轴比例\n",
    "ax.set_xlim([0, 8])  # 设置 x 轴范围\n",
    "ax.set_ylim([0, 8])  # 设置 y 轴范围\n",
    "\n",
    "plt.xticks(np.arange(0, 8 + 1, step=2))  # 设置 x 轴刻度\n",
    "plt.yticks(np.arange(0, 8 + 1, step=2))  # 设置 y 轴刻度\n",
    "\n",
    "ax.spines['top'].set_visible(False)  # 隐藏顶部边框\n",
    "ax.spines['right'].set_visible(False)  # 隐藏右边框"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eec0a357-1359-4a10-a72d-88d72833169d",
   "metadata": {},
   "source": [
    "## a1 和 a2 的可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "09fafe47-572c-482c-8ca4-4084800db9ac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.plot(ZZ1, ZZ2, color=[0.8, 0.8, 0.8])  # 绘制变换后的网格线\n",
    "plt.plot(ZZ1.T, ZZ2.T, color=[0.8, 0.8, 0.8])  # 绘制变换后的网格线\n",
    "\n",
    "draw_vector(a1, np.array([0, 112, 192]) / 255)  # 绘制第一个基向量\n",
    "draw_vector(a2, np.array([255, 0, 0]) / 255)  # 绘制第二个基向量\n",
    "\n",
    "draw_vector(b, np.array([255, 125, 255]) / 255)  # 绘制向量 b\n",
    "\n",
    "plt.axis('scaled')  # 设置坐标轴比例\n",
    "ax.set_xlim([0, 8])  # 设置 x 轴范围\n",
    "ax.set_ylim([0, 8])  # 设置 y 轴范围\n",
    "\n",
    "plt.xticks(np.arange(0, 8 + 1, step=2))  # 设置 x 轴刻度\n",
    "plt.yticks(np.arange(0, 8 + 1, step=2))  # 设置 y 轴刻度\n",
    "\n",
    "ax.spines['top'].set_visible(False)  # 隐藏顶部边框\n",
    "ax.spines['right'].set_visible(False)  # 隐藏右边框"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85a80909-2aac-49ed-bb7a-f8cc6b80ee7d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ecd322f4-f919-4be2-adc3-69d28ef25e69",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
